package de.herzog.bbp.files;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.herzog.bbp.model.Spiel;
import de.herzog.bbp.model.dao.SpielDAO;
import de.herzog.bbp.view.SpielBeanSorter;
import de.herzog.bbp.view.bean.SpielBean;

public class ExportExcel {

	private static final Logger LOG = LoggerFactory.getLogger(ImportExcel.class);

	public static synchronized void exportSpiele(String fileName) throws FileNotFoundException, IOException {
		FileArchiver.createArchiveFile(fileName);
		exportSpiele(fileName, SpielBeanSorter.KLASSE_SORT);

		String fileNameAlternateSort = fileName.replaceAll(".xls$", "-Heimvereinsortierung.xls");
		Files.deleteIfExists(Paths.get(fileNameAlternateSort));
		Files.copy(Paths.get(fileName), Paths.get(fileNameAlternateSort));
		exportSpiele(fileNameAlternateSort, SpielBeanSorter.HEIMVEREIN_SORT);

		LOG.info("End export.");
	}

	private static void exportSpiele(String fileName, SpielBeanSorter sorter) throws FileNotFoundException, IOException {
		List<Spiel> spiele = SpielDAO.loadAll();
		LOG.info("Starting export of " + spiele.size() + " rows sorted by " + sorter.toString());

		List<SpielBean> spielBeans = new ArrayList<>();
		spiele.stream().map(SpielBean::new).forEach(spielBeans::add);
		sorter.sort(spielBeans);

		FileInputStream fileInputStream = new FileInputStream(fileName);
		HSSFWorkbook workbook = new HSSFWorkbook(fileInputStream);
		HSSFSheet sheet = workbook.getSheetAt(0);
		int first = sheet.getFirstRowNum() + 1;
		int last = sheet.getLastRowNum();

		int rowIndex = first;
		for (SpielBean spieleBean : spielBeans) {
			HSSFRow row = getRow(sheet, rowIndex++);
			int colIndex = 0;
			getCell(row, colIndex++).setCellValue(spieleBean.getWochentag());
			getCell(row, colIndex++).setCellValue(spieleBean.getDatum());
			getCell(row, colIndex++).setCellValue(spieleBean.getZeit());
			getCell(row, colIndex++).setCellValue(spieleBean.getKlasse());
			getCell(row, colIndex++).setCellValue(spieleBean.getNummer());
			getCell(row, colIndex++).setCellValue(spieleBean.getHeimVerein());
			getCell(row, colIndex++).setCellValue(spieleBean.getHeimNummer());
			getCell(row, colIndex++).setCellValue(spieleBean.getGastVerein());
			getCell(row, colIndex++).setCellValue(spieleBean.getGastNummer());
			getCell(row, colIndex++).setCellValue(spieleBean.getHalleNummer());
			getCell(row, colIndex++).setCellValue(spieleBean.getSchiri());
		}

		for (int rowIndexDel = last; rowIndexDel >= rowIndex; rowIndexDel--) {
			sheet.removeRow(sheet.getRow(rowIndexDel));
		}

		fileInputStream.close();
		FileOutputStream fileOutputStream = new FileOutputStream(fileName);
		workbook.write(fileOutputStream);
		fileOutputStream.close();
	}

	private static HSSFRow getRow(HSSFSheet sheet, int rowIndex) {
		HSSFRow row = sheet.getRow(rowIndex);
		if (row == null) {
			row = sheet.createRow(rowIndex);
		}
		return row;
	}

	private static HSSFCell getCell(HSSFRow row, int colIndex) {
		HSSFCell cell = row.getCell(colIndex);
		if (cell == null) {
			cell = row.createCell(colIndex);
		}
		return cell;
	}
}
